/* 
泛型:
    定义函数/类/接口时, 不确定的类型, 使用时才指定具体类型
    指在定义函数、接口或类的时候，不预先指定具体的类型，而在使用的时候再指定具体类型的一种特性。

需求:
  创建一个函数, 实现功能: 根据指定的数量 count 和数据 value , 
  创建一个包含 count 个 value 的数组
*/

(() => {
  function createArray(count: number, value: any): any[] {
    const arr: any[] = []
    for (let index = 0; index < count; index++) {
      arr.push(value)
    }
    return arr
  }

  const arr = createArray(3, 12.34)
  console.log(arr[0].toFixed2())
  const arr2 = createArray(3, 'abcd')
  console.log(arr2[0].length2)

  /* 
  泛型函数: 带泛型的函数
  1. 定义泛型: 在定义的函数名右侧   <泛型名称> => <T/K/V>
  2. 使用泛型: 形参/返回值/函数体
  3. 指定具体类型: 调用函数的函数名右侧  <具体类型>
  */
  function createArray2<T>(count: number, value: T): T[] {
    const arr: T[] = []
    for (let index = 0; index < count; index++) {
      arr.push(value)
    }
    return arr
  }

  const arr3 = createArray2<number>(3, 12.34)
  console.log(arr3[0].toFixed()) // 有语法提示
  const arr4 = createArray2<string>(3, 'abcd')
  console.log(arr4[1].length) // 有语法提示

  const arr5 = createArray2(3, true) // 可以推断出泛型的具体类型为boolean

})()